package com.hooper.threadpool.demo;

import java.util.*;

/**
 * 自定义线程池类
 * 成员变量:
     * 1:任务队列集合     需要控制线程安全问题
     * 2:当前线程数量
     * 3∶核心线程数量
     * 4:最大线程数量
     * 5:任务队列的长度
 * 成员方法:
     * 1:提交任务;
     * 将任务添加到集合中,需要判断是否超出了任务总长度
     * 2:执行任务;
     * 判断当前线程的数量,决定创建核心线程还是非核心线程
 * @author Tim Hooper
 * @version 1.0
 * @time 2023/03/02/18:15
 */
public class MyThreadPool {
    public MyThreadPool(int coreThreadCount, int maxThreadCount, int taskQueueLength) {
        this.coreThreadCount = coreThreadCount;
        this.maxThreadCount = maxThreadCount;
        this.taskQueueLength = taskQueueLength;
    }

    /*
     * 1:任务队列集合需要控制线程安全问题
     * 2:当前线程数量
     * 3∶核心线程数量
     * 4:最大线程数量
     * 5:任务队列的长度
     */
    private final List<Runnable> taskList = Collections.synchronizedList(new LinkedList<>());
    private int currentThreadCount;
    private final int coreThreadCount;
    private final int maxThreadCount;
    private final int taskQueueLength;

    public void submit(Runnable task){
        //若任务数量达到或超过队列阈值，放弃
        if (taskList.size() >= taskQueueLength){
            System.err.println("task->" + task +" has been abandoned, cuz the task queue is full!");
        }else {
            //将任务添加到队列
            taskList.add(task);
            //执行任务
            execTask(task);
        }
    }

    private void execTask(Runnable task) {
        if (currentThreadCount < coreThreadCount) {
            new MyWorker("核心线程 - " + currentThreadCount, taskList).start();
            ++currentThreadCount;
        }else if (currentThreadCount < maxThreadCount){
            new MyWorker("非核心线程 - " + currentThreadCount,taskList).start();
            ++currentThreadCount;
        }else {
            System.out.println("task->" + task +" has been cached, cuz the thread count has reached the max size.");
        }
    }
}
